<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<style>
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}
* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>
<title>控制器</title>

</head>
<body>
<h1>控制器</h1>

<ul>
<li><a href="#basic-controllers">基本控制器</a></li>
<li><a href="#controller-filters">控制器过滤器</a></li>
<li><a href="#restful-controllers">RESTful控制器</a></li>
<li><a href="#resource-controllers">资源控制器</a></li>
<li><a href="#handling-missing-methods">处理未定义的方法</a></li>
</ul>


<p><a name="basic-controllers"></a></p>

<h2>基本控制器</h2>

<p>除了在 <code>routes.php</code> 文件中定义您的路由逻辑，您也可能希望使用控制器组织这些逻辑。控制器可以根据相关的路由逻辑对路由进行分组，并且能够享用框架的高级功能比如自动 <a href="/docs/ioc">依赖注入</a>。</p>

<p>控制器通常存放在 <code>app/controllers</code> 目录，并且这个目录默认在 <code>composer.json</code> 文件的 <code>classmap</code> 选项中注册。</p>

<p>下面是一个基本控制器类的例子：</p>

<pre><code>class UserController extends BaseController {

    /**
     * Show the profile for the given user.
     */
    public function showProfile($id)
    {
        $user = User::find($id);

        return View::make('user.profile', array('user' =&gt; $user));
    }

}
</code></pre>

<p>所有的控制器应该继承 <code>BaseController</code> 类。<code>BaseController</code> 类也存放在 <code>app/controllers</code> 目录下，可以被用来存放共享的控制器逻辑。<code>BaseController</code> 类继承自框架的 <code>Controller</code> 类，现在我们可以像这样为控制器添加路由：</p>

<pre><code>Route::get('user/{id}', 'UserController@showProfile');
</code></pre>

<p>如果您使用 PHP 命名空间嵌套或组织您的控制器，在定义路由的时候可以使用控制类的全称：</p>

<pre><code>Route::get('foo', 'Namespace\FooController@method');
</code></pre>

<p>您也可以控制器的路由指定名字：</p>

<pre><code>Route::get('foo', array('uses' =&gt; 'FooController@method',
                                        'as' =&gt; 'name'));
</code></pre>

<p>使用 <code>URL::action</code> 函数从控制器函数生成 URL：</p>

<pre><code>$url = URL::action('FooController@method');
</code></pre>

<p>使用 <code>currentRouteAction</code> 函数获取控制器函数的名字：</p>

<pre><code>$action = Route::currentRouteAction();
</code></pre>

<p><a name="controller-filters"></a></p>

<h2>控制器过滤器</h2>

<p><a href="/docs/routing#route-filters">过滤器</a> 可以用来像常规路由一样指定控制器路由：</p>

<pre><code>Route::get('profile', array('before' =&gt; 'auth',
            'uses' =&gt; 'UserController@showProfile'));
</code></pre>

<p>但是，您也可以在控制器中指定过滤器：</p>

<pre><code>class UserController extends BaseController {

    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this-&gt;beforeFilter('auth');

        $this-&gt;beforeFilter('csrf', array('on' =&gt; 'post'));

        $this-&gt;afterFilter('log', array('only' =&gt;
                            array('fooAction', 'barAction')));
    }

}
</code></pre>

<p>您也可以使用闭包在控制器中指定过滤器：</p>

<pre><code>class UserController extends BaseController {

    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this-&gt;beforeFilter(function()
        {
            //
        });
    }

}
</code></pre>

<p><a name="restful-controllers"></a></p>

<h2>RESTful控制器</h2>

<p>Laravel 允许您按照简单的，REST 命名惯例轻松的定义一条路由来处理控制器的所有函数。首先，使用 <code>Route::controller</code> 定义路由：</p>

<p><strong>定义一个 RESTful 控制器</strong></p>

<pre><code>Route::controller('users', 'UserController');
</code></pre>

<p><code>controller</code> 函数接受两个参数。第一个参数是控制器处理的基准 URI。下面，在控制器中添加函数，需要添加 HTTP 访问方法的前缀：</p>

<pre><code>class UserController extends BaseController {

    public function getIndex()
    {
        //
    }

    public function postProfile()
    {
        //
    }

}
</code></pre>

<p><code>index</code> 函数将作为控制器处理根 URI 访问的响应，在这个例子中是 <code>users</code>。</p>

<p>如果您的控制器函数包含多个单词，您可以通过在 URI 中使用下划线的语法来访问这个函数。比如，下面这个在 <code>UserController</code> 的控制器函数将会作为 <code>users/admin-profile</code> URI 的响应：</p>

<pre><code>public function getAdminProfile() {}
</code></pre>

<p><a name="resource-controllers"></a></p>

<h2>资源控制器</h2>

<p>资源控制器使得基于资源构建 RESTful 控制器变得简单。比如，您可能希望创建一个控制器管理应用程序中的照片。在 Artisan 命令行中使用 <code>controller:make</code> 命令以及 `Route::resource 函数，我们可以很快的创建这样一个控制器。</p>

<p>通过命令行创建控制器，请执行以下命令：</p>

<pre><code>php artisan controller:make PhotoController
</code></pre>

<p>现在注册一个基于资源的路由到控制器：</p>

<pre><code>Route::resource('photo', 'PhotoController');
</code></pre>

<p>这个简单的路由声明创建了许多路由来处理对照片资源的 RESTful 访问。同样的，生成的控制器已经拥有了对各个访问处理的函数。</p>

<p><strong>资源控制器处理的访问</strong></p>

<table>
<thead>
<tr>
<th>Verb      </th>
<th> Path                  </th>
<th> Action       </th>
<th> Route Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>GET       </td>
<td> /resource             </td>
<td> index        </td>
<td> resource.index</td>
</tr>
<tr>
<td>GET       </td>
<td> /resource/create      </td>
<td> create       </td>
<td> resource.create</td>
</tr>
<tr>
<td>POST      </td>
<td> /resource             </td>
<td> store        </td>
<td> resource.store</td>
</tr>
<tr>
<td>GET       </td>
<td> /resource/{id}        </td>
<td> show         </td>
<td> resource.show</td>
</tr>
<tr>
<td>GET       </td>
<td> /resource/{id}/edit   </td>
<td> edit         </td>
<td> resource.edit</td>
</tr>
<tr>
<td>PUT/PATCH </td>
<td> /resource/{id}        </td>
<td> update       </td>
<td> resource.update</td>
</tr>
<tr>
<td>DELETE    </td>
<td> /resource/{id}        </td>
<td> destroy      </td>
<td> resource.destroy</td>
</tr>
</tbody>
</table>


<p>有些时候，您只需要处理一部分资源访问：</p>

<pre><code>php artisan controller:make PhotoController --only=index,show

php artisan controller:make PhotoController --except=index
</code></pre>

<p>并且，您也可以在路由中指明一部分资源访问的处理：</p>

<pre><code>Route::resource('photo', 'PhotoController',
                array('only' =&gt; array('index', 'show')));
</code></pre>

<p><a name="handling-missing-methods"></a></p>

<h2>处理未定义的方法</h2>

<p>在控制中没有找到匹配函数的时候，一个全捕捉函数可以被定义用来调用。这个函数应该被命名为 <code>missingMethod</code> 并且接受请求的参数数组做为它的唯一参数：</p>

<p><strong>定义一个全捕捉函数</strong></p>

<pre><code>public function missingMethod($parameters)
{
    //
}
</code></pre>
</body>
</html>